﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    public partial class formularioEdificioEditarUnidades : Form
    {
        // Nombre del edificio.
        private string nombreEdificio;
        public string NombreEdificio
        {
            get { return nombreEdificio; }
            set { nombreEdificio = value;
            RellenaDGV(false);
            }
        }

        // Indica desde dónde se está realizando el drag & drop.
        private int desdeDrag;

        // Enteros que codifican el origen del drag & drop.
        private const int NINGUNO = 0;
        private const int DISPONIBLES = 1;
        private const int GENERADAS = 2;

        /// <summary>
        /// Constructor.
        /// </summary>
        public formularioEdificioEditarUnidades()
        {
            InitializeComponent();

            // No se está realizando desplazamiento.
            desdeDrag = NINGUNO;

            // Texto explicativo.
            labelExplicacion.Text = "Arrastra las unidades disponibles que desées que puedan producirse en el edificio " + nombreEdificio + ".";
        }

        public void RellenaDGV(bool nuevo)
        {
            // ArrayList de unidades generadas.
            ArrayList listaUnidadesGeneradas;

            // ArrayList de unidades disponibles.
            ArrayList listaUnidadesDisponibles;

            // Obtenemos las unidades generadas por el edificio.
            listaUnidadesGeneradas = formularioEdificioEditar.Instancia.Ed.Unidades;

            // Actualizamos la lista de unidades creadas por el edificio en el formulario de edición.
            formularioEdificioEditar.Instancia.ListaUn = formularioEdificioEditar.Instancia.Ed.Unidades;
            
            // Obtenemos la lista de unidades disponibles.
            listaUnidadesDisponibles = CADUnidad.Instancia.getUnidadesExcepto(listaUnidadesGeneradas);
            
            // Limpiamos los dgv.
            dgvUnidadesDisponibles.Rows.Clear();
            dgvUnidadesGeneradas.Rows.Clear();

            // Obtenemos la ruta.
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));
            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\unidades\";
            
            // Mostrmaos las unidades disponibles.
            try
            {
                int cantidadDisponibles = 0;
                foreach (ENUnidad un in listaUnidadesDisponibles)
                {
                    dgvUnidadesDisponibles.Rows.Add(1);
                    try
                    {
                        dgvUnidadesDisponibles.Rows[cantidadDisponibles].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + un.Nombre + ".png");
                    }
                    catch (Exception)
                    {
                        dgvUnidadesDisponibles.Rows[cantidadDisponibles].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;
                    }
                    dgvUnidadesDisponibles.Rows[cantidadDisponibles].Cells[1].Value = un.Nombre.ToString();
                    cantidadDisponibles++;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
            // Mostramos las unidades generadas.
            try
            {
                int cantidadGeneradas = 0;
                foreach (int nombre in listaUnidadesGeneradas)
                {
                    dgvUnidadesGeneradas.Rows.Add(1);
                    string nom = CADUnidad.Instancia.getNombreUnidad(nombre).Trim();
                    try
                    {
                        dgvUnidadesGeneradas.Rows[cantidadGeneradas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + nom + ".png");
                    }
                    catch (Exception)
                    {
                        dgvUnidadesGeneradas.Rows[cantidadGeneradas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;
                    }
                    dgvUnidadesGeneradas.Rows[cantidadGeneradas].Cells[1].Value = CADUnidad.Instancia.getNombreUnidad(nombre);
                    cantidadGeneradas++;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Evento que se lanza cuando se pulsa el ratón sobre el dgv de unidades. Se encarga de seleccionar la fila sobre la
        /// que se encuentra el ratón la prepara para el drag & drop. También indica que se está realizando desde disponibles.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Parámetros.</param>
        private void dgvUnidadesDisponibles_MouseDown(object sender, MouseEventArgs e)
        {
            // Indicamos que el drag&drop se está realizando desde disponibles.
            desdeDrag = DISPONIBLES;

            // Obtenemos el indice de la fila sobre la que se ha pulsado.
            int indice = dgvUnidadesDisponibles.HitTest(e.X, e.Y).RowIndex;
            if (dgvUnidadesDisponibles.SelectedRows.Count > 0)
            {
                dgvUnidadesDisponibles.SelectedRows[0].Selected = false;    // Deseleccionamos la anterior y seleccionamos la nueva.
            }
            
            

            // Si el indice es correcto iniciamos el drag & drop.
            if (indice > -1)
            {
                dgvUnidadesDisponibles.Rows[indice].Selected = true;        // Supuestamente esto hará que seleccione al pelico.
                dgvUnidadesDisponibles.DoDragDrop(indice, DragDropEffects.Move);
            }
        }

        /// <summary>
        /// Establece el efecto del drag&drop a Move cuando se desplaza sobre el dgv.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Parámetros.</param>
        private void dgvUnidadesDisponibles_DragOver(object sender, DragEventArgs e)
        {
            
            e.Effect = DragDropEffects.Move;
        }

        /// <summary>
        /// Realiza el movimiento de las unidades desde el DGV de generadas al de disponibles.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvUnidadesDisponibles_DragDrop(object sender, DragEventArgs e)
        {
            // Comprobamos si viene desde el otro DGV.
            if (desdeDrag == GENERADAS)
            {
                try
                {
                    // Eliminamos cada una de las unidades que a partir de este momento no serán disponibles.
                    foreach (DataGridViewRow r in dgvUnidadesGeneradas.SelectedRows)
                    {
                        ENUnidad un = CADUnidad.Instancia.getUnidad(r.Cells[1].Value.ToString());
                        string nombre = CADUnidad.Instancia.getNombreUnidad(un.Id);
                        formularioEdificioEditar.Instancia.lbUnidades.Items.Remove(nombre);
                        formularioEdificios.Instancia.Estado = "editando";
                        formularioEdificioEditar.Instancia.Ed.Unidades.Remove(un.Id);
                    }

                    // Actualizamos el DGV.
                    RellenaDGV(false);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            // Ha finalizado el drag & drop.
            desdeDrag = NINGUNO;
        }


        /// <summary>
        /// Evento que se lanza cuando se pulsa el ratón sobre el dgv de unidades generadas. Se encarga de seleccionar la fila sobre la
        /// que se encuentra el ratón la prepara para el drag & drop. También indica que se está realizando desde generadas.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvUnidadesGeneradas_MouseDown(object sender, MouseEventArgs e)
        {
            // Indicamos que el drag&drop se está realizando desde disponibles.
            desdeDrag = GENERADAS;

            // Obtenemos el indice de la fila sobre la que se ha pulsado.
            int indice = dgvUnidadesGeneradas.HitTest(e.X, e.Y).RowIndex;

            if (dgvUnidadesGeneradas.SelectedRows.Count > 0)
            {
                dgvUnidadesGeneradas.SelectedRows[0].Selected = false;    // Deseleccionamos la anterior y seleccionamos la nueva.
            }
           
            // Si el indice es correcto iniciamos el drag & drop.
            if (indice > -1)
            {
                dgvUnidadesGeneradas.Rows[indice].Selected = true;        // Supuestamente esto hará que seleccione al pelico.
                dgvUnidadesGeneradas.DoDragDrop(indice, DragDropEffects.Move);
            }
        }

        /// <summary>
        /// Establece el efecto del drag&drop a Move cuando se desplaza sobre el dgv.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvUnidadesGeneradas_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvUnidadesGeneradas_DragDrop(object sender, DragEventArgs e)
        {
            // Comprobamos que viene desde el otro DGV.
            if (desdeDrag == DISPONIBLES)
            {
                try
                {
                    // Eliminamos cada una de las unidades que a partir de este momento no serán disponibles.
                    foreach (DataGridViewRow r in dgvUnidadesDisponibles.SelectedRows)
                    {
                        formularioEdificios.Instancia.Estado = "editando";
                        ENUnidad un = CADUnidad.Instancia.getUnidad(r.Cells[1].Value.ToString());
                        formularioEdificioEditar.Instancia.Ed.Unidades.Add(un.Id);
                        string nombre = CADUnidad.Instancia.getNombreUnidad(un.Id);
                        formularioEdificioEditar.Instancia.lbUnidades.Items.Add(nombre);
                    }

                    // Actualizamos el DGV.
                    RellenaDGV(false);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            // Ha finalizado el drag & drop.
            desdeDrag = NINGUNO;
        }

        private void btFinalizar_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}
